# -*- coding: utf-8 -*-
'''
@summary: Módulo DataBase.py é responsável pela conexao à base de 
dados, leitura do ficheiro fornecido e inserçao dos conteudo na tabela
 
@requires: DataManager.py
	
@development environment:
Maquina Virtual com Debian7.1
Python 2.7
wxGlade

@author: Adriano Leal - 11951, Gonçalo Ferreira - 11958
@version: 2.4
@date: 04/12/2013
'''

import sqlite3
from sqlalchemy import *
from xlrd import open_workbook
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
import DataManager
import Distritos
"""
criaçao da base de dados
Documentação SQLalchemy
http://docs.sqlalchemy.org/en/rel_0_9/orm/tutorial.html#connecting
"""
"""
Criação das conexões com a base de dados.
"""
db = create_engine('sqlite:///cna.db', encoding='latin1', echo=True)
conexao = sqlite3.connect("cna.db")
cursor = conexao.cursor()

db.echo = False  # Try changing this to True and see what happens
metadata = MetaData(bind=db)

book = open_workbook('cna131fresultados.xls')
sh = book.sheet_by_index(0)

cursor.execute('DROP TABLE IF EXISTS resultados')

Base = declarative_base()


class DadosCandidatura(Base):
    __tablename__ = "resultados"
    id = Column(Integer, primary_key=True)
    cod_inst = Column(Integer)
    cod_curso = Column(Integer)
    nome_inst = Column(String(100))
    nome_curso = Column(String(60))
    grau = Column(String(2))
    vagas_init = Column(Integer)
    colocados = Column(Integer)
    media_ult = Column(Float)
    vagas_fim = Column(Integer)
    distrito = Column(String(100))


    def __init__(self, tuplo):
        self.cod_inst = tuplo[0]
        self.cod_curso = tuplo[1]
        self.nome_inst = tuplo[2]
        self.nome_curso = tuplo[3]
        self.grau = tuplo[4]
        self.vagas_init = tuplo[5]
        self.colocados = tuplo[6]
        self.media_ult = tuplo[7]
        self.vagas_fim = tuplo[8]
        self.distrito = tuplo[9]


Table('resultados', metadata,
      Column('id', Integer(), primary_key=True, nullable=False),
      Column('cod_inst', Integer()),
      Column('cod_curso', Integer()),
      Column('nome_inst', String(100)),
      Column('nome_curso', String(60)),
      Column('grau', String(2)),
      Column('vagas_init', Integer()),
      Column('colocados', Integer()),
      Column('media_ult', Float()),
      Column('vagas_fim', Integer()),
      Column('distrito', String(100)),
      sqlite_autocomplete=True,
)
metadata.create_all(db)

Session = sessionmaker(bind=db)
session = Session()

lista_dados = []

for row in range(4, sh.nrows):
    if (sh.cell_value(row, 0)) == '':
        break
    else:
        cod_inst = sh.cell_value(row, 0)
        cod_curso = sh.cell_value(row, 1)
        nome_inst = sh.cell_value(row, 2)
        nome_inst = nome_inst.split(' - ')
        nome_inst = nome_inst[0]
        nome_curso = sh.cell_value(row, 3)
        grau = sh.cell_value(row, 4)
        vagas_init = sh.cell_value(row, 5)
        colocados = sh.cell_value(row, 6)
        if (sh.cell_value(row, 7)) == '':
            media_ult = 0.0
        else:
            media_ult = sh.cell_value(row, 7)
            vagas_fim = sh.cell_value(row, 8)
            distrito = ''

        tuplo = (cod_inst, cod_curso, nome_inst,
                 nome_curso, grau, vagas_init,
                 colocados, media_ult, vagas_fim, distrito)
        # Cria uma lista de listas.
        lista_dados.append(tuplo)

for tuplo in lista_dados:
    dados = DadosCandidatura(tuplo)
    session.add(dados)

session.commit()


class popularDistrito():

    codigo_instituicao = []
    def cod_instituicao(self):
        """
        consulta códigos das instituições
        :return:
        retorna a consulta de códigos das instituições sem repetição
        """
        #cursor = self.cursor()
        cursor.execute('SELECT DISTINCT(cod_inst) from resultados')
        codigoInst = cursor.fetchall()
        for data in codigoInst:
            self.codigo_instituicao.append(data)
        return self.codigo_instituicao


    def criar_codigos_distrito(self):
        """
        Chamada de funções que que trazem dados para comparação
        com as listas que contém o nome dos Distritos.
        """

        """
        Ciclo faz a comparação nome Distrito com o Código do Distrito,
        se for igual faz um update no campo distrito da tabela resultados.
        """

        #datamng = DataManager.Datamanager()
        #cod_inst = datamng.cod_instituicao()
        #datamng.cod_instituicao()


        cod_inst = self.cod_instituicao()


        #dist = Distritos()
        dist = Distritos.Dist()

        for ci, g in enumerate(self.codigo_instituicao):
            if cod_inst[ci] in dist.aveiro:
                for av in dist.aveiro:
                    cursor.execute("UPDATE resultados SET distrito = 'AVEIRO' WHERE cod_inst = ?", av)
            elif cod_inst[ci] in dist.beja:
                for av in dist.beja:
                    cursor.execute("UPDATE resultados SET distrito = 'BEJA' WHERE cod_inst = ?", av)
            elif cod_inst[ci] in dist.braga:
                for av in dist.braga:
                    cursor.execute("UPDATE resultados SET distrito = 'BRAGA' WHERE cod_inst = ?", av)
            elif cod_inst[ci] in dist.braganca:
                for av in dist.braganca:
                    cursor.execute("UPDATE resultados SET distrito = 'BRAGANÇA' WHERE cod_inst = ?", av)
            elif cod_inst[ci] in dist.cst_brnco:
                for av in dist.cst_brnco:
                    cursor.execute("UPDATE resultados SET distrito = 'CASTELO BRANCO' WHERE cod_inst = ?", av)
            elif cod_inst[ci] in dist.coimbra:
                for av in dist.coimbra:
                    cursor.execute("UPDATE resultados SET distrito = 'COIMBRA' WHERE cod_inst = ?", av)
            elif cod_inst[ci] in dist.evora:
                for av in dist.evora:
                    cursor.execute("UPDATE resultados SET distrito = 'EVORA' WHERE cod_inst = ?", av)
            elif cod_inst[ci] in dist.faro:
                for av in dist.faro:
                    cursor.execute("UPDATE resultados SET distrito = 'FARO' WHERE cod_inst = ?", av)
            elif cod_inst[ci] in dist.guarda:
                for av in dist.guarda:
                    cursor.execute("UPDATE resultados SET distrito = 'GUARDA' WHERE cod_inst = ?", av)
            elif cod_inst[ci] in dist.leiria:
                for av in dist.leiria:
                    cursor.execute("UPDATE resultados SET distrito = 'LEIRIA' WHERE cod_inst = ?", av)
            elif cod_inst[ci] in dist.lisboa:
                for av in dist.lisboa:
                    cursor.execute("UPDATE resultados SET distrito = 'LISBOA' WHERE cod_inst = ?", av)
            elif cod_inst[ci] in dist.portalegre:
                for av in dist.portalegre:
                    cursor.execute("UPDATE resultados SET distrito = 'PORTALEGRE' WHERE cod_inst = ?", av)
            elif cod_inst[ci] in dist.porto:
                for av in dist.porto:
                    cursor.execute("UPDATE resultados SET distrito = 'PORTO' WHERE cod_inst = ?", av)
            elif cod_inst[ci] in dist.santarem:
                for av in dist.santarem:
                    cursor.execute("UPDATE resultados SET distrito = 'SANTARÉM' WHERE cod_inst = ?", av)
            elif cod_inst[ci] in dist.setubal:
                for av in dist.setubal:
                    cursor.execute("UPDATE resultados SET distrito = 'SETÚBAL' WHERE cod_inst = ?", av)
            elif cod_inst[ci] in dist.v_castelo:
                for av in dist.v_castelo:
                    cursor.execute("UPDATE resultados SET distrito = 'VIANA DO CASTELO' WHERE cod_inst = ?", av)
            elif cod_inst[ci] in dist.vila_real:
                for av in dist.vila_real:
                    cursor.execute("UPDATE resultados SET distrito = 'VILA REAL' WHERE cod_inst = ?", av)
            elif cod_inst[ci] in dist.viseu:
                for av in dist.viseu:
                    cursor.execute("UPDATE resultados SET distrito = 'VISEU' WHERE cod_inst = ?", av)
            elif cod_inst[ci] in dist.acores:
                for av in dist.acores:
                    cursor.execute("UPDATE resultados SET distrito = 'AÇORES' WHERE cod_inst = ?", av)
            elif cod_inst[ci] in dist.madeira:
                for av in dist.madeira:
                    cursor.execute("UPDATE resultados SET distrito = 'MADEIRA' WHERE cod_inst = ?", av)
            else:
                print 'ERRO'

        conexao.commit()

data = popularDistrito()
data.criar_codigos_distrito()

